package com.example.demosdk;

import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;

import java.util.Arrays;
import java.util.List;

/**
 * 海康sdk调用接口
 */
public interface HCNetSDK extends StdCallLibrary {

    /**
     * 常量
     */
    int SERIALNO_LEN = 48;   //序列号长度
    int NAME_LEN = 32;    //用户名长度

    //method
    boolean NET_DVR_Init();

    boolean NET_DVR_Cleanup();

    NativeLong NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);

    boolean NET_DVR_Logout_V30(NativeLong lUserID);

    boolean NET_DVR_SetSTDConfig(NativeLong lUserID, int dwCommand, NET_DVR_STD_CONFIG lpInConfigParam);

    boolean NET_DVR_GetSTDConfig(NativeLong lUserID, int dwCommand, NET_DVR_STD_CONFIG lpOutConfigParam);

    boolean NET_DVR_CaptureJPEGPicture_WithAppendData(NativeLong lUserID, int lChannel, NET_DVR_JPEGPICTURE_WITH_APPENDDATA lpJpegWithAppend);

    int NET_DVR_GetLastError();

    //启用日志文件写入接口
    boolean NET_DVR_SetLogToFile(int bLogEnable, String strLogDir, boolean bAutoDel);

    //NET_DVR_Login_V30()参数结构
    class NET_DVR_DEVICEINFO_V30 extends Structure {
        public byte[] sSerialNumber = new byte[SERIALNO_LEN];  //序列号
        public byte byAlarmInPortNum;                //报警输入个数
        public byte byAlarmOutPortNum;                //报警输出个数
        public byte byDiskNum;                    //硬盘个数
        public byte byDVRType;                    //设备类型, 1:DVR 2:ATM DVR 3:DVS ......
        public byte byChanNum;                    //模拟通道个数
        public byte byStartChan;                    //起始通道号,例如DVS-1,DVR - 1
        public byte byAudioChanNum;                //语音通道数
        public byte byIPChanNum;                    //最大数字通道个数
        public byte[] byRes1 = new byte[24];                    //保留
    }

    class NET_DVR_THERMOMETRY_PRESETINFO extends Structure {
        public int dwSize;//结构体大小
        public short wPresetNo;//0-保留
        public byte[] byRes = new byte[2];
        public NET_DVR_THERMOMETRY_PRESETINFO_PARAM[] struPresetInfo = new NET_DVR_THERMOMETRY_PRESETINFO_PARAM[40];
    }

    class NET_DVR_THERMOMETRY_PRESETINFO_PARAM extends Structure {
        public byte byEnabled;  //是否使能：0- 否，1- 是
        public byte byRuleID;//规则ID 0-表示无效，从1开始 （list内部判断数据有效性）
        public short wDistance;//距离(m)[0, 10000]
        public float fEmissivity;//发射率(发射率 精确到小数点后两位)[0.01, 1.00](即：物体向外辐射能量的本领)
        public byte byDistanceUnit;//距离单位: 0-米（m），1-英尺（feet）,2-厘米(centimeter)
        public byte[] byRes = new byte[2];
        public byte byReflectiveEnabled;//反射温度使能：0- 否，1- 是
        public float fReflectiveTemperature;//反射温度 精确到小数后2位
        public byte[] szRuleName = new byte[NAME_LEN/*32*/];//规则名称
        public byte[] byRes1 = new byte[63];
        public byte byRuleCalibType;//规则标定类型 0-点，1-框，2-线
        public NET_VCA_POINT struPoint;//点测温坐标（当规则标定类型为"点"的时候生效）
        public NET_VCA_POLYGON struRegion;//区域、线（当规则标定类型为"框"或者"线"的时候生效）
    }

    class NET_VCA_POINT extends Structure {
        public float fX;                                // X轴坐标, 0.001~1
        public float fY;                                //Y轴坐标, 0.001~1
    }

    class NET_VCA_POLYGON extends Structure {
        public int dwPointNum;                                  //有效点 大于等于3，若是3点在一条线上认为是无效区域，线交叉认为是无效区域
        public NET_VCA_POINT[] struPos = new NET_VCA_POINT[10]; //多边形边界点,最多十个
    }

    class NET_DVR_THERMOMETRY_COND extends Structure {
        public int dwSize;//结构体大小
        public int dwChannel;
        public short wPresetNo;//0-保留
        public byte[] byRes = new byte[62];
    }

    class NET_DVR_STD_CONFIG extends Structure {
        public Pointer lpCondBuffer;        //[in]条件参数(结构体格式),例如通道号等.可以为NULL
        public int dwCondSize;            //[in] lpCondBuffer指向的内存大小
        public Pointer lpInBuffer;            //[in]输入参数(结构体格式),设置时不为NULL，获取时为NULL
        public int dwInSize;            //[in] lpInBuffer指向的内存大小
        public Pointer lpOutBuffer;        //[out]输出参数(结构体格式),获取时不为NULL,设置时为NULL
        public int dwOutSize;            //[in] lpOutBuffer指向的内存大小
        public Pointer lpStatusBuffer;        //[out]返回的状态参数(XML格式),获取成功时不会赋值,如果不需要,可以置NULL
        public int dwStatusSize;        //[in] lpStatusBuffer指向的内存大小
        public Pointer lpXmlBuffer;    //[in/out]byDataType = 1时有效,xml格式数据
        public int dwXmlSize;      //[in/out]lpXmlBuffer指向的内存大小,获取时同时作为输入和输出参数，获取成功后会修改会实际长度，设置时表示实际长度，而不是整个内存大小
        public byte byDataType;     //[in]输入/输出参数类型,0-使用结构体类型lpInBuffer/lpOutBuffer有效,1-使用XML类型lpXmlBuffer有效
        public byte[] byRes = new byte[23];
    }

    class BYTE_ARRAY extends Structure {
        public byte[] byValue;

        public BYTE_ARRAY(int iLen) {
            byValue = new byte[iLen];
        }

        @Override
        protected List<String> getFieldOrder() {
            return Arrays.asList("byValue");
        }
    }

    //设备抓图附加全屏测温数据结构体
    class NET_DVR_JPEGPICTURE_WITH_APPENDDATA extends Structure {
        public int dwSize;
        public int dwChannel;//通道号
        public int dwJpegPicLen;//Jpeg图片长度
        public Pointer pJpegPicBuff;//Jpeg图片指针
        public int dwJpegPicWidth;  // 图像宽度
        public int dwJpegPicHeight;  //图像高度
        public int dwP2PDataLen;//全屏测温数据长度
        public Pointer pP2PDataBuff; //全屏测温数据指针
        public byte byIsFreezedata;//是否数据冻结 0-否 1-是
        public byte[] byRes = new byte[255];
    }
}
